Skip to main content

libobs_simple\sources\windows\sources/
mod.rs

1use std::ffi::CStr;
2
3pub mod window_capture;
4use libobs_wrapper::{
5    impl_signal_manager, run_with_obs, runtime::ObsRuntime, sources::ObsSourceTrait,
6    unsafe_send::SmartPointerSendable, utils::ObsError,
7};
8pub use window_capture::{
9    WindowCaptureSource, WindowCaptureSourceBuilder, WindowCaptureSourceUpdater,
10};
11
12mod capture;
13pub use capture::*;
14
15pub mod game_capture;
16pub use game_capture::{
17    GameCaptureSource, GameCaptureSourceBuilder, GameCaptureSourceUpdater, ObsGameCaptureMode,
18    ObsGameCaptureRgbaSpace,
19};
20
21pub mod monitor_capture;
22pub use monitor_capture::{MonitorCaptureSourceBuilder, MonitorCaptureSourceUpdater};
23
24#[cfg(feature = "window-list")]
25pub use libobs_window_helper::{WindowInfo, WindowSearchMode};
26
27use crate::sources::ObsEitherSource;
28
29// There's no way to get that through the bindings, so I'll just define it here
30const AUDIO_SOURCE_TYPE: &CStr = c"wasapi_process_output_capture";
31pub(super) fn audio_capture_available(runtime: &ObsRuntime) -> Result<bool, ObsError> {
32    run_with_obs!(runtime, || unsafe {
33        // Safety: This is safe because we know that this type ID exists in OBS if the feature is available
34        !libobs::obs_get_latest_input_type_id(AUDIO_SOURCE_TYPE.as_ptr()).is_null()
35    })
36}
37
38impl_signal_manager!(|ptr: SmartPointerSendable<*mut libobs::obs_source>| unsafe {
39    // Safety: We are using a smart pointer, so it is fine
40    libobs::obs_source_get_signal_handler(ptr.get_ptr())
41}, ObsHookableSourceSignals for *mut libobs::obs_source, [
42    "hooked": {struct HookedSignal {
43        title: String,
44        class: String,
45        executable: String;
46        POINTERS {
47            source: *mut libobs::obs_source_t,
48        }
49    }},
50    "unhooked": {struct UnhookedSignal {
51        POINTERS {
52            source: *mut libobs::obs_source_t,
53        }
54    }},
55]);
56
57pub trait ObsHookableSourceTrait {
58    fn source_specific_signals(&self) -> std::sync::Arc<ObsHookableSourceSignals>;
59}
60
61impl<
62        A: ObsHookableSourceTrait + ObsSourceTrait + Clone + 'static,
63        B: ObsHookableSourceTrait + ObsSourceTrait + Clone + 'static,
64    > ObsHookableSourceTrait for ObsEitherSource<A, B>
65{
66    fn source_specific_signals(&self) -> std::sync::Arc<ObsHookableSourceSignals> {
67        match self {
68            ObsEitherSource::Left(a) => a.source_specific_signals(),
69            ObsEitherSource::Right(b) => b.source_specific_signals(),
70        }
71    }
72}